
package ch.hearc.coursJava.moo.garage;

import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

public class Garage implements Iterable<Voiture>
	{

	/*------------------------------------------------------------------*\
	|*							Constructeurs							*|
	\*------------------------------------------------------------------*/

	public Garage(String nom)
		{
		this.nom = nom;

		this.listVoiture = new LinkedList<Voiture>();
		}

	public Garage(Garage source)
		{
		this(source.nom);

		for(Voiture voiturei : source.listVoiture)
			{
			this.listVoiture.add(voiturei.cloneOf());
			}
		}

	/*------------------------------------------------------------------*\
	|*							Methodes Public							*|
	\*------------------------------------------------------------------*/
	@Override
	public Iterator<Voiture> iterator()
		{
		return listVoiture.listIterator();
		}

	public boolean isEgal(Garage garage2)
		{
		if (!this.nom.equals(garage2.nom))
			{
			return false;
			}
		else
			{
			if (this.listVoiture.size() != garage2.listVoiture.size())
				{
				return false;
				}
			else
				{
				Iterator<Voiture> listVoiture2i = garage2.listVoiture.iterator();

				for(Voiture voiturei:this.listVoiture)
					{
					if (!voiturei.isEgal(listVoiture2i.next())) { return false; }
					}

				return true;
				}
			}
		}

	public Garage cloneOf()
		{
		return new Garage(this);
		}

	@Override
	public String toString()
		{
		Collections.sort(listVoiture, new Comparator<Voiture>()
			{

				@Override
				public int compare(Voiture v1, Voiture v2)
					{
					return v1.getMarque().compareTo(v2.getMarque());
					}
			});
		StringBuilder builder = new StringBuilder();
		builder.append("Garage [listVoiture=");
		builder.append(this.listVoiture);
		builder.append(", nom=");
		builder.append(this.nom);
		builder.append("]");
		return builder.toString();
		}

	public void in(Voiture voiture)
		{
		this.listVoiture.add(voiture);
		}

	public boolean out(Voiture voiture)
		{
		return this.listVoiture.remove(voiture);
		}

	/*------------------------------*\
	|*				Set				*|
	\*------------------------------*/

	public void setNom(String nom)
		{
		this.nom = nom;
		}

	/*------------------------------*\
	|*				Get				*|
	\*------------------------------*/

	public String getNom()
		{
		return this.nom;
		}

	/*------------------------------------------------------------------*\
	|*							Methodes Private						*|
	\*------------------------------------------------------------------*/

	/*------------------------------------------------------------------*\
	|*							Attributs Private						*|
	\*------------------------------------------------------------------*/

	// Tools
	private List<Voiture> listVoiture;

	// Input / output
	private String nom;


	}
